// #include "oj_server.hpp"

// using namespace httplib;
// using namespace ns_controller;
// using namespace ns_users;
// using namespace oj_server;

// static Controller *ctrl_ptr = nullptr;

// // 启动主机
// void Recovery(int sig)
// {
//     ctrl_ptr->RecoveryMachines();
// }

// // 模拟会话存储
// std::unordered_map<std::string, std::string> session_store;
// // 创建用户对象
// Users user("../comm/Databases/userInfo.db");
// int main(int argc, char *argv[])
// {
//     if (argc != 2)
//     {
//         std::cerr << "Usage: " << argv[0] << " port" << std::endl;
//         std::cout << "Example: " << argv[0] << " 8080" << std::endl;
//         return -1;
//     }

//     signal(SIGQUIT, Recovery);
//     // std::shared_ptr: 自动释放
//     std::shared_ptr<Users> users(new Users);
//     std::shared_ptr<Server> svr(new Server);
//     Controller ctrl;
//     ctrl_ptr = &ctrl;

//     svr->Post("/submit_application.html", [&](const httplib::Request &req, httplib::Response &resp)
//               {
//                   resp.status = 302;                                       // 302 是重定向的状态码
//                   resp.set_header("Location", "/submit_application.html"); // 替换为实际的重定向页面
//               });

//     // ------------------ 登录用户 -----------------------
//     // svr->Post("/login.html", [&users](const httplib::Request &req, httplib::Response &resp)
//     svr->Post("/api/login", [&users](const httplib::Request &req, httplib::Response &resp)
//               {
//                 LOG(INFO) << "Received a login request" << std::endl;

//                 std::string username = req.get_param_value("username");
//                 std::string password = req.get_param_value("password");
//                 std::string email = req.get_param_value("email");
//                 Json::Value responseJson;

//                 if (user.login(username, password, email)) {
//                     responseJson["status"] = "success";
//                     responseJson["message"] = "登录成功";

//                     // 生成会话 ID
//                     std::string session_id = StringUtil::generate_session_id();
//                     session_store[session_id] = username;

//                     // 设置会话 ID 到 Cookie
//                     resp.set_header("Set-Cookie", "session_id=" + session_id);
                    
//                     // 设置响应头和状态码
//                     resp.status = 200; // 使用 200 状态码
//                     resp.set_header("Content-Type", "application/json");
//                     resp.set_content(responseJson.toStyledString(), "application/json");

//                 } else {
//                     responseJson["status"] = "error";
//                     responseJson["message"] = "登录失败: 用户名或密码错误";

//                     resp.status = 200; // 使用 200 状态码
//                     resp.set_header("Content-Type", "application/json");
//                     resp.set_content(responseJson.toStyledString(), "application/json");
//                 } });

//     // ------------------ 注册用户 -----------------------
//     svr->Post("/api/register", [&users](const httplib::Request &req, httplib::Response &resp)
//               {
//                   LOG(INFO) << "Received a register request" << std::endl;

//                   std::string username = req.get_param_value("username");
//                   std::string email = req.get_param_value("email");
//                   std::string password = req.get_param_value("password");
//                   std::string message;

//                   // 创建一个 JSON 对象
//                   Json::Value jsonResponse;

//                   // 假设 user.registerUser 返回一个 bool 表示成功或失败
//                   bool success = user.registerUser(username, password, email, message);

//                   // 设置 JSON 响应内容
//                   jsonResponse["status"] = success ? "success" : "error";
//                   jsonResponse["message"] = message;

//                   // 将 JSON 对象转换为字符串
//                   Json::StreamWriterBuilder writer;
//                   std::string jsonString = Json::writeString(writer, jsonResponse);

//                   // 设置响应内容
//                   resp.set_content(jsonString, "application/json; charset=utf-8");
//                   resp.status = success ? 200 : 400; // 根据成功或失败设置状态码
//               });

//     // ------------------ 登出 -----------------------
//     svr->Get("/api/logout", [](const httplib::Request &req, httplib::Response &resp)
//              {
//             LOG(INFO) << "Received a logout request" << std::endl;
//             auto cookies = req.get_header_value("Cookie");
//             std::string session_id = StringUtil::extract_session_id(cookies);

//             // 删除会话数据
//             session_store.erase(session_id);

//             // 清除客户端 Cookie
//             resp.set_header("Set-Cookie", "session_id=; expires=Thu, 01 Jan 1970 00:00:00 GMT");
            
//             resp.status = 302;
//             resp.set_header("Location", "/login.html"); });

//     // ------------------- 注销用户 -----------------------
//     svr->Post("/api/log-off", [](const httplib::Request &req, httplib::Response &resp)
//             {
//                 LOG(INFO) << "Received a log-off request" << std::endl;
                
//                 // 从请求中提取 Cookie
//                 auto cookies = req.get_header_value("Cookie");
//                 std::string session_id = StringUtil::extract_session_id(cookies);

//                 // 查找用户名与会话 ID 相关联
//                 std::string username = session_store[session_id];

//                 if (!username.empty() && user.logoff(username)) {
//                     // 删除会话数据
//                     session_store.erase(session_id);

//                     // 清除客户端 Cookie
//                     resp.set_header("Set-Cookie", "session_id=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/");

//                     // 返回重定向响应
//                     resp.status = 302;
//                     resp.set_header("Location", "/login.html");
//                 } else {
//                     LOG(DEBUG) << "Logout failed: user not found or error during logout" << std::endl;
//                     resp.status = 500; // Internal Server Error
//                     resp.set_content("Logout failed", "text/plain");
//                 }
//             });


//     // ---------------- 题库信息 ----------------------
//     svr->Get("/all_questions.html", [&ctrl](const Request &req, Response &resp)
//              {
//                 std::string html;
//                 ctrl.AllQuestionToHtml(&html);
//                 /*用户所看到的即: 网页数据 + 题目相关数据*/
//                 resp.set_content(html, "text/html; charset=utf-8"); });

//     // ---------------- 更新用户信息 ----------------------
//     svr->Post("/api/update-user-info", [](const httplib::Request &req, httplib::Response &resp)
//               {
//                 auto cookies = req.get_header_value("Cookie");
//                 std::string session_id = StringUtil::extract_session_id(cookies);

//                 std::string username = session_store[session_id];

//                 // 解析请求体中的 JSON 数据
//                 Json::Value jsonData;
//                 Json::Reader reader;
//                 if (!reader.parse(req.body, jsonData)) {
//                     resp.status = 400; // 错误请求
//                     resp.set_content("{\"status\":\"error\",\"message\":\"Invalid JSON\"}", "application/json");
//                     LOG(ERROR) << "Invalid JSON: " << req.body << std::endl;
//                     return;
//                 }

//                 // 检查必需的字段
//                 std::string fields[] = {"username", "email", "phone", "gender", "description"};
//                 for (const std::string &field : fields) {
//                     if (!jsonData.isMember(field)) {
//                         resp.status = 400; // 错误请求
//                         std::string message = "{\"status\":\"error\",\"message\":\"Missing field: " + field + "\"}";
//                         resp.set_content(message, "application/json");
//                         LOG(ERROR) << "Missing field: " << field << std::endl;
//                         return;
//                     }
//                 }

//                 // 构造更新信息的 JSON 对象
//                 Json::Value newInfo;
//                 newInfo["username"] = jsonData["username"].asString();
//                 newInfo["email"] = jsonData["email"].asString();
//                 newInfo["phone"] = jsonData["phone"].asString();
//                 newInfo["gender"] = jsonData["gender"].asString();
//                 newInfo["description"] = jsonData["description"].asString();

//                 // 调用 updateUserInfo 函数
//                 std::string response;
//                 bool update_success = user.updateUserInfo(username, newInfo, response);

//                 if (update_success) {
//                     resp.set_content("{\"status\":\"success\",\"message\":\"User info updated successfully\"}", "application/json");
//                 } else {
//                     resp.status = 500; // 服务器错误
//                     resp.set_content("{\"status\":\"error\",\"message\":\"" + response + "\"}", "application/json");
//                 } });

//     // 用户信息
//     svr->Get("/api/user-info", [](const httplib::Request &req, httplib::Response &resp)
//              {
//                     LOG(INFO) << "Received a userInfo request" << std::endl;
//                     auto cookies = req.get_header_value("Cookie");
//                     std::string session_id = StringUtil::extract_session_id(cookies);

//                     Json::Value responseJson;

//                     if (session_store.find(session_id) != session_store.end()) {
//                         std::string username = session_store[session_id];
                        
//                         // 用户已登录，获取用户信息
//                         LOG(INFO) << "用户 \"" << username << "\" 处于登录状态中。" << std::endl;
//                         Json::Value userInfo = user.getUserInfo(username);
//                         LOG(INFO) << "getInfo执行完毕" << "\n";
                        
//                         // 检查 userInfo 是否有效
//                         if (!userInfo.isNull()) {
//                             responseJson["status"] = "success";
//                             responseJson["message"] = "用户信息获取成功";
//                             responseJson["data"] = userInfo;  // 将用户信息包含在响应中
//                         } else {
//                             responseJson["status"] = "error";
//                             responseJson["message"] = "无法获取用户信息";
//                         }
//                     } else {
//                         // 用户未登录
//                         responseJson["status"] = "error";
//                         responseJson["message"] = "用户未登录";
//                     }

//                     LOG(INFO) << "Response JSON: " << responseJson << std::endl;
//                     Json::StreamWriterBuilder writer;
//                     std::string responseBody = Json::writeString(writer, responseJson);
//                     resp.set_content(responseBody, "application/json; charset=utf-8"); });

//     /*
//      * 根据题目编号 获取题目内容
//      * question/114514 -> 正则匹配
//      * R"()" -> raw string(原始字符串)，保持字符串原貌-不做转义
//      * (\d+) -> 匹配一个或多个数字
//      */
//     svr->Get(R"(/question/(\d+))", [&ctrl](const Request &req, Response &resp)
//              {
//         std::string number = req.matches[1];
//         std::string html;
//         ctrl.SingleQuestionToHtml(number, &html);
//         resp.set_content(html, "text/html; charset=utf-8"); });

//     /*
//      * 提交代码
//      * 1. 获取用户提交代码
//      * 2. 调用编译器 (compile_and_run)
//      * 3. 调用判题系统 // 每道题的测试用例
//      * 4. 返回判题结果
//      */
//     svr->Post(R"(/judge/(\d+))", [&ctrl](const Request &req, Response &resp)
//               {
//         std::string number = req.matches[1];
//         // std::string code = req.body;
//         std::string result_json;
        
//         // 调用判题系统
//         ctrl.Judge(number, req.body, &result_json);
//         resp.set_content(result_json, "application/json; charset=utf8"); });

//     svr->set_base_dir("./wwwRoot");
//     std::cout << "listen..." << std::endl;
//     svr->listen("0.0.0.0", atoi(argv[1]));

//     return 0;
// }